package com.imageim.yimirror.base;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.support.multidex.MultiDexApplication;

import com.danikula.videocache.HttpProxyCacheServer;
import com.imageim.yimirror.banner.MyFileNameGenerator;
import com.imageim.yimirror.common.uncaughException.AppUncaughtExceptionHandler;
import com.imageim.yimirror.common.uncaughException.SdcardConfig;
import com.imageim.yimirror.common.util.SoundUtil;
import com.tencent.bugly.Bugly;

import java.io.File;
import java.util.Locale;

import cn.bingoogolapple.swipebacklayout.BGASwipeBackHelper;
import me.jessyan.autosize.AutoSize;
import me.jessyan.autosize.AutoSizeConfig;
import me.jessyan.autosize.onAdaptListener;
import me.jessyan.autosize.utils.LogUtils;

public class BaseApplication extends MultiDexApplication {
    private static final String TAG = "BaseApplication";
    private static BaseApplication context;
    private HttpProxyCacheServer proxy;
    private static BaseApplication mInstance = null;
    //    private RefWatcher refWatcher;

    public static Context getContext() {
        return context;
    }


    public static BaseApplication getInstance() {
        if (mInstance == null) {
            throw new IllegalStateException("Application is not created.");
        }
        return mInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        context = this;
        //        if (BuildConfig.DEBUG) {
        //            refWatcher = setupLeakCanary();
        //        }
        initBugly();
        initAutoSize();
        SoundUtil.loadAll(this);
        BGASwipeBackHelper.init(this, null);
    }




    private void initBugly() {
        //第三个参数测试阶段建议设置成true，发布时设置为false
        /**
         * tob appId : 867c00d99d
         * toc appId : 9e130cba56
         */
        Bugly.init(getApplicationContext(), "867c00d99d", false);
//        Bugly.setAppChannel(this, AppUtil.getChannelId(this));
        //        CrashReport.testJavaCrash();
    }


    /**
     * 初始化异常捕获
     */
    private void initBugReport() {
        // 初始化文件目录
        SdcardConfig.getInstance().initSdcard();
        // 捕捉异常
        AppUncaughtExceptionHandler crashHandler = AppUncaughtExceptionHandler.getInstance();
        crashHandler.init(getApplicationContext());
    }




    //    private RefWatcher setupLeakCanary() {
    //        if (LeakCanary.isInAnalyzerProcess(this)) {
    //            return RefWatcher.DISABLED;
    //        }
    //        return LeakCanary.install(this);
    //    }

    /**
     * LeakCanary全局监控对象 Activity不需要执行  Fragment需要添加以下代码
     * RefWatcher refWatcher = LeakApplication.getRefWatcher(this);
     * refWatcher.watch(this);
     *
     * @param context
     * @return
     */
    //    public static RefWatcher getRefWatcher(Context context) {
    //        BaseApplication leakApplication = (BaseApplication) context.getApplicationContext();
    //        return leakApplication.refWatcher;
    //    }


    /**
     * HttpProxyCacheServer 创建
     */
    public static HttpProxyCacheServer getProxy(Context context) {
        BaseApplication app = (BaseApplication) context.getApplicationContext();
        return app.proxy == null ? (app.proxy = app.newProxy()) : app.proxy;
    }

    /**
     * 配置VideoCache
     */
    private HttpProxyCacheServer newProxy() {
        HttpProxyCacheServer proxy = new HttpProxyCacheServer.Builder(this)
                //缓存路径
                .cacheDirectory(new File(Constants.VIDEO_CACHE_DIRECTORY))
                //最大缓存 1 Gb for cache
                .maxCacheSize(1024 * 1024 * 1024)
                //                .maxCacheSize(20)
                .fileNameGenerator(new MyFileNameGenerator())
                .build();
        return proxy;
    }

    /**
     * 获取自身App安装包信息
     */
    public PackageInfo getLocalPackageInfo() {
        return getPackageInfo(getPackageName());
    }

    /**
     * 获取App安装包信息
     */
    public PackageInfo getPackageInfo(String packageName) {
        PackageInfo info = null;
        try {
            info = getPackageManager().getPackageInfo(packageName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return info;
    }


    public void initAutoSize() {
        AutoSizeConfig.getInstance()
                //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
                //如果没有这个需求建议不开启
                .setCustomFragment(true)
                //是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
                //如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
                //                .setExcludeFontScale(true)
                //屏幕适配监听器
                .setOnAdaptListener(new onAdaptListener() {
                    @Override
                    public void onAdaptBefore(Object target, Activity activity) {
                        //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                        //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
                        //                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
                        //                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                        LogUtils.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
                    }

                    @Override
                    public void onAdaptAfter(Object target, Activity activity) {
                        LogUtils.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
                    }
                })

        //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
        //                .setLog(false)

        //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
        //AutoSize 会将屏幕总高度减去状态栏高度来做适配
        //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
        //                .setUseDeviceSize(true)
        //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
        //                .setBaseOnWidth(false)
        //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
        //                .setAutoAdaptStrategy(new AutoAdaptStrategy())
        ;
        //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
        //在 Demo 中跳转的三方库中的 DefaultErrorActivity 就是在另外一个进程中, 所以要想适配这个 Activity 就需要调用 initCompatMultiProcess()
        AutoSize.initCompatMultiProcess(this);
        //        customAdaptForExternal();
    }

    /**
     * 给外部的三方库 {@link Activity} 自定义适配参数, 因为三方库的 {@link Activity} 并不能通过实现
     * 接口的方式来提供自定义适配参数 (因为远程依赖改不了源码)
     */
    private void customAdaptForExternal() {
        //        AutoSizeConfig.getInstance().getExternalAdaptManager()
        //加入的 Activity 将会放弃屏幕适配, 一般用于三方库的 Activity, 详情请看方法注释
        //如果不想放弃三方库页面的适配, 请用 addExternalAdaptInfoOfActivity 方法, 建议对三方库页面进行适配, 让自己的 App 更完美一点
        //                .addCancelAdaptOfActivity(DefaultErrorActivity.class)
        //但前提是三方库页面的布局使用的是 dp 和 sp, 如果布局全部使用的 px, 那 AndroidAutoSize 也将无能为力
        //经过测试 DefaultErrorActivity 的设计图宽度在 380dp - 400dp 显示效果都是比较舒服的
        //                .addExternalAdaptInfoOfActivity(DefaultErrorActivity.class, new ExternalAdaptInfo(true, 400));
    }

}
